package LineCode.剑指Offer.位运算;

/**
 * 输入一个整数，输出该数二进制表示中1的个数。其中负数用补码表示。
 */
public class 二进制中1的个数 {

    public static void main(String[] args) {
        int index = -1;
        System.out.println(NumberOf1(index));
        System.out.println(NumberOf2(index));
    }

    /**
     * 数学上的直接除以二 递归的方法
     * @param n
     * @return
     */
    public static int NumberOf1(int n) {
        if (n == 0) return 0;
        if (n < 0) return NumberOf1(2147483647 + 1 + n) + 1;
        return NumberOf1(n/2) + n%2;
    }

    /**
     * 一般解
     * @param n
     * @return
     */
    public static int NumberOf2(int n) {
        int index = 1;
        int sum = 0;
        while (index > 0) {
            if ((index & n) != 0)
                sum++;
            index <<= 1;
        }
        return sum;
    }
    /**
     * 最优解
     * @param n
     * @return
     */
    public static int NumberOf3(int n) {
        int count = 0;
        while (n != 0) {
            count++;
            n = n & (n-1);
        }
        return count;
    }

    /**
     * 字符串替换 并量长度
     * @param n
     * @return
     */
    public static int NumberOf4(int n) {
        return Integer.toBinaryString(n).replaceAll("0","").length();
    }


}
